/**
 * @author JosпїЅ Manuel Mateos DurпїЅn
 *         JosпїЅ RaпїЅl Castro Castro
 * @Last_updated 5 de Junio, 2009.
 * @description: Agente consumidor.
 * 			La idea es que me pase una cadena de pujas con el mпїЅximo a pujar al crear el agente.
 *          Hay un contador (rondaActual) que te seпїЅala la puja en concreto sobre la que estamos.
 */
package agentes09.agentes;

import jade.core.AID;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import agentes09.negotiation.ProdConsProtocol.protocol.prodcons.ConsumerBehaviour;

public class AgenteConsumidor extends AgenteConEstado {

	/**
	 * Pujas mпїЅximas por libro. pujas[i]: LпїЅmite mпїЅximo a pujar por el
	 * agente consumidor en la ronda i.
	 */
	private String pujas[];

	/**
	 * Indica sobre que ronda estamos. Si se supone una sola ronda no es
	 * necesario actualizarlo. En caso contrario, es necesario actualizarlo al
	 * iniciar una nueva ronda. Es decir, tras el mensaje ACCEPT_PROPOSAL.
	 */
	private int rondaActual = 0;

	protected void setup() {
		super.setup();
		registrarEnDF();

		String myName = getAID().getName();
		System.out.println("El agente " + myName + " esta preparado");
		Object[] args = getArguments();
		if (args != null && args.length > 0) {
			// Guardar pujas mпїЅximas en el array de pujas.
			for (int cnt = 0; cnt < args.length; cnt++) {
				pujas[cnt] = (String) args[cnt];
			}

			// SegпїЅn info web
			// http://code.google.com/p/agentes09/wiki/NegociacionProductorConsumidor
			ConsumerBehaviour cb = new ConsumerBehaviour(this) {
				
				// @Override
				public boolean isPriceAcceptable(double offeredPrice) {
					// TODO se tiene que implementar
					boolean isAcceptable = true; // su implementación aquí
					return isAcceptable;
				}

				// @Override
				public boolean isReadyToPay(double price) {
					// TODO se tiene que implementar
					boolean isReadyToPay = true; // su implementación aquí
					return isReadyToPay;
				}

				// @Override
				public boolean executePayment(AID aid, double price) {
					// TODO se tiene que implementar
					boolean isPaymentSuccessful = true; // su implementación del pago aquí
					return isPaymentSuccessful;
				}
			};
			addBehaviour(cb);

			try {
				Thread.sleep(20000);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		} else {
			System.out
					.println("El agente consumidor no interviene en las pujas");
			doDelete();
		}
	}

	/**
	 * Este metodo registra al agenteconsumidor en el DF
	 */
	private void registrarEnDF() {
		DFAgentDescription dfd = new DFAgentDescription();
		dfd.setName(getAID());
		ServiceDescription sd = new ServiceDescription();
		sd.setType("Consumidor");
		sd.setName(getLocalName());
		dfd.addServices(sd);
		try {
			DFService.register(this, dfd);
		} catch (FIPAException fe) {
			fe.printStackTrace();
		}
	}

	// Terminar el agente
	protected void takeDown() {
		try {
			DFService.deregister(this);
		} catch (FIPAException fe) {
			fe.printStackTrace();
		}
		System.out.println("El agente " + getAID().getName() + " ha terminado");
	}

	/*
	 * Se encarga de actualizar la ronda sobre la cual nos encontramos. Nota:
	 * Este mпїЅtodo debe de ser llamado al iniciar una nueva ronda. Es decir,
	 * tras el envпїЅo del mensaje ACCEPT_PROPOSAL.
	 */
	public void setIncrementarRonda() {
		rondaActual++;
	}

	/**
	 * Obtiene el valor actual de la ronda actual sobre la que se decide el
	 * precio.
	 * 
	 * @return El nпїЅmero de ronda actual, donde 0 es la ronda primera.
	 */
	public int getRonda() {
		return rondaActual;
	}

	/**
	 * Reinicia la variable Ronda actual a su valor inicial de ronda primera.
	 */
	public void resetRonda() {
		rondaActual = 0;
	}

	// /**
	// * MпїЅtodo que nos indica si el consumidor acepta el precio propuesto por
	// el consumidor.
	// * @return boolean True -> El consumidor acepta el precio, False en caso
	// contrario.
	// */
	// public boolean isPriceAcceptable() {
	// boolean resultado = true; // Acepto por defecto el precio.
	//    	    	
	// int precioMaxAPujar = Integer.parseInt(pujas[rondaActual].trim());
	// int precioSugeridoProductor = 0; // No se de donde tomarпїЅa este
	// valor...?
	//        
	// if (precioSugeridoProductor > precioMaxAPujar){
	// resultado = false;
	// }
	//    	    	
	// return resultado;
	// }
}
